home *** CD-ROM | disk | FTP | other *** search
- The file you've unzipped contains 2 executable programs and the complete
- source code for each. The programs are meant to be examples of a fast method
- for rotating bitmaps. I came up with the method on my own. Though I'm sure
- it has been used before by other people, I've never seen it talked about or
- presented by anyone else.
-
- BITMAP.EXE -- This program pans/scales/rotates a 256x256 bitmap which is
- tiled over the whole screen. Though it uses 320x200 mode (13h) it maintains
- a 1:1 aspect ratio. The source is fully commented and meant for people to
- learn from. It is written in Turbo Pascal with some inline assembly, but
- C programmers should be able to make good sense of it. The test bitmap
- created by the program is stupid, but it does show what can happen to certain
- types of images when they are scaled down. If anyone throws in code to load
- a standard image file please let me know.
-
- TILE.EXE -- This one does basically the same thing, only it uses a 32x32
- bitmap defined in the source which can be easily altered by anyone with
- the compiler. There are NO comments and the aspect ratio is not correct.
- The code is not well optimized, so it's slower.
-
- Overview of rotation methods:
- -----------------------------
- I've heard a lot of people ask how to rotate a bitmap, and there seem to
- be a few common methods that get brought up:
-
- 1) Scan the source image pixel by pixel. For each one, transform the
- coordinates (with a rotation matrix or whatever) and plot the pixel
- at these new coordinates in the destination image. This method produces
- bad images with holes, because not all pixels in the destination image
- get written to.
-
- 2) Scan the destination image pixel by pixel and 'untransform' (ie. rotate
- the opposite direction) the coordinates of the pixel and use the new
- coordinates to grab a pixel from the source image and copy it to the
- destination. This prevent the 'holes' from appearing, because EVERY
- pixel in the destination is mapped to something in the source image.
-
- 3) Do 3 shear operations. Shearing a rectangular bitmap will turn it into
- a parallelogram. You can achieve a rotation by performing 3 shear
- operations on it. This is often given (as of this writing) as a good way
- to do it, but I never tried. #4 is just plain faster.
-
- 4) The method used by these programs is to scan the destination image
- left to right/top to bottom, and at the same time scan the source image
- by using rotated 'right' and 'down' vectors. This can be done extremely
- fast by using fixed point math for the vectors and coordinates, and
- eliminates the need to do any transformations. This method is faster than
- the others and produces no holes in the destination image. It also allows
- easy scaling of the bitmap at the same time (as do the other methods).
-
- Sprites:
- --------
- Most people want to rotate sprites, not do what these programs do. If you
- understand the code, you can see that it isn't hard to adapt it to draw
- sprites. I recommend storing them in a 256-wide image, so the 8.8 fixed
- point calculations can be preserved. So what if thats wider than your
- sprite... Put a couple side by side in the image. Also, the inner
- loop will have to be modified so that it won't write the 'clear' parts
- of the sprite to the destination image. This can be done by adding 2
- instructions to the inner loop like so:
-
- mov bl,[ds:bx]
- or bl,bl
- jz nodraw <-- Add these 2 instructions
- mov [es:di],bl <-- and label the 'inc' instruction
- nodraw: inc di
-
- This will slow things down a bit, but for actually doing sprites you'll
- want to have it branch when it IS drawing a pixel, since that will probably
- happen LESS often. (a 16x16 sprite requires scaning a 27x27 pixel area to
- allow full rotation, and this extra area will all be clear.)
-
- I hope all this helps someone. I've already started writing a game with it
- and I can think of a few more that would be cool.
-
- -Paul-
-
- comments to---> phkahler@oakland.edu
-